package com.msf.tutorial.java8.chapter9;

import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.stream.Stream;

/**
 * 构建流
 */
public class Stream1 {

    /**
     * 由值创建流
     */
    public static void of() {
        Stream<String> stream = Stream.of("Java 8 ", "Lambdas ", "In ", "Action");
        stream.map(String::toUpperCase).forEach(System.out::println);
    }

    /**
     * 创建空流
     */
    public static void empty() {
        Stream<String> emptyStream = Stream.empty();
    }

    /**
     * 由数组创建流
     */
    public static void array() {
        int[] numbers = {2, 3, 5, 7, 11, 13};
        int sum = Arrays.stream(numbers).sum();
    }

    /**
     * 由文件生成流
     *
     * 检查文件中单词的数量
     *
     * 使用Files.lines得到一个流，其中的每个元素都是给定文件中的一行
     */
    public static void file() {
        long uniqueWords = 0;
        try(Stream<String> lines = Files.lines(Paths.get("data.txt"), Charset.defaultCharset())){
            uniqueWords = lines.flatMap(line -> Arrays.stream(line.split(" ")))
                    .distinct()
                    .count();
        } catch(IOException e) {
            // 如果打开文件时出现异常则加以处理
        }
    }

    /**
     * 由函数生成流：创建无限流
     */
    public static void iterate() {
        Stream.iterate(0, n -> n + 2)
            .limit(10)
            .forEach(System.out::println);
    }

    /**
     * 使用 无限流 生成 斐波纳契数列
     */
    public static void fabonacci() {
        Stream.iterate(new int[]{0, 1}, n -> new int[]{n[1], n[0]+n[1]})
            .limit(20)
            .forEach(System.out::println);
    }

    /**
     * 由函数生成流：创建无限流
     */
    public static void generate() {
        Stream.generate(() -> Math.random())
                .limit(10)
                .forEach(System.out::println);
    }


}
